﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы
 
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УИДПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
	Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ",
		Новый УникальныйИдентификатор(УИДПользователяИБ));
	
	ИмяСправочникаВариантыОтчетов = "";
	Параметры.Свойство("ИмяСправочникаВариантыОтчетов", ИмяСправочникаВариантыОтчетов);
		
	ВариантОтчета = Неопределено;
	Если Параметры.Свойство("ВариантОтчета", ВариантОтчета) Тогда
		Для Каждого ПодчиненныйЭлемент Из Элементы.ГруппаКнопокПросмотрОтчетовВложенная.ПодчиненныеЭлементы Цикл
			Если ПодчиненныйЭлемент.Имя <> "ГруппаКнопокУдалитьСнимокОтчета" Тогда
				ПодчиненныйЭлемент.Доступность = Ложь;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
		
	ОбновитьСнимкиОтчетов(ИмяСправочникаВариантыОтчетов, ВариантОтчета);

	Если СнимкиОтчетов.Количество() > 0 Тогда
		ТекущийСнимокОтчета = 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура СнимкиОтчетов(Команда)
	
	ОткрытьФорму("РегистрСведений.СнимкиОтчетов.ФормаСписка",
				Новый Структура("Пользователь", Пользователь));
	
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиККонцу(Команда)
	
	ТекущийСнимокОтчета = СнимкиОтчетов.Количество();
	ПрочитатьСнимокОтчета();
	
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКНачалу(Команда)

	Если СнимкиОтчетов.Количество() > 0 Тогда
		ТекущийСнимокОтчета = 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПерейтиНазад(Команда)
	
	Если ТекущийСнимокОтчета > 1 Тогда
		ТекущийСнимокОтчета = ТекущийСнимокОтчета - 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиВперед(Команда)
	
	Если ТекущийСнимокОтчета < СнимкиОтчетов.Количество() Тогда
		ТекущийСнимокОтчета = ТекущийСнимокОтчета + 1;
		ПрочитатьСнимокОтчета();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьСнимокОтчета(Команда)
	
	Если ТекущийСнимокОтчета <> 0 Тогда
		УдалитьСнимокОтчетаНаСервере();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ОбновитьСнимкиОтчетов(ИмяСправочникаВариантыОтчетов, ВариантОтчета)
	
	СнимкиОтчетовПользователя = РегистрыСведений.СнимкиОтчетов.СнимкиОтчетовПользователя(Пользователь, ИмяСправочникаВариантыОтчетов);
	СнимкиОтчетовПользователя.ЗаполнитьЗначения(Пользователь, "Пользователь");
	
	Если ЗначениеЗаполнено(ВариантОтчета) Тогда
		Счетчик = 0;
		Пока Счетчик < СнимкиОтчетовПользователя.Количество() Цикл
			Если СнимкиОтчетовПользователя[Счетчик].Вариант = ВариантОтчета Тогда
				Счетчик = Счетчик + 1;
			Иначе
				СнимкиОтчетовПользователя.Удалить(Счетчик);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;	
	
	СнимкиОтчетов.Загрузить(СнимкиОтчетовПользователя);
	
КонецПроцедуры

&НаСервере
Процедура ПрочитатьСнимокОтчета()
	
	СтрокаОтчет = СнимкиОтчетов[ТекущийСнимокОтчета-1];
	
	ОтчетТабличныйДокумент.Очистить();
	ДатаАктуальности = Неопределено;
	
	МенеджерЗаписи = РегистрыСведений.СнимкиОтчетов.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтрокаОтчет);
	МенеджерЗаписи.Прочитать();
	Если МенеджерЗаписи.Выбран() Тогда
		Если МенеджерЗаписи.ОшибкаОбновленияОтчета Тогда
			ОбщегоНазначения.СообщитьПользователю(НСтр(
				"ru = 'Снимок отчета был записан с ошибкой - необходимо его перезаписать'"));
		Иначе
			РезультатОтчета = МенеджерЗаписи.РезультатОтчета.Получить();
			Если ТипЗнч(РезультатОтчета) = Тип("ТабличныйДокумент") Тогда
				ОтчетТабличныйДокумент.Вывести(РезультатОтчета);
				МенеджерЗаписи.ДатаПоследнегоПросмотра = ТекущаяДатаСеанса();
				МенеджерЗаписи.Записать();
			Иначе
				ОбщегоНазначения.СообщитьПользователю(НСтр(
					"ru = 'Ошибка при чтении снимка отчета - некорректные данные'"));
			КонецЕсли;
		КонецЕсли;
		ДатаАктуальности = МенеджерЗаписи.ДатаАктуальности;
	Иначе
		ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Ошибка при чтении снимка отчета - отчет был удален'"));
	КонецЕсли;
	
	Заголовок = НСтр("ru = 'Актуальность'") + ": " + ДатаАктуальности;
	
КонецПроцедуры

&НаСервере
Процедура УдалитьСнимокОтчетаНаСервере()
	
	СтрокаОтчет = СнимкиОтчетов[ТекущийСнимокОтчета-1];
	
	ОтчетТабличныйДокумент.Очистить();
	
	МенеджерЗаписи = РегистрыСведений.СнимкиОтчетов.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МенеджерЗаписи, СтрокаОтчет);
	МенеджерЗаписи.Прочитать();
	Если МенеджерЗаписи.Выбран() Тогда
		МенеджерЗаписи.Удалить();
	КонецЕсли;
	
	СнимкиОтчетов.Удалить(СтрокаОтчет);
	
	Если ТекущийСнимокОтчета > СнимкиОтчетов.Количество() Тогда
		ТекущийСнимокОтчета = СнимкиОтчетов.Количество();
	КонецЕсли;
	
	Если ТекущийСнимокОтчета > 0 Тогда
		ПрочитатьСнимокОтчета();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти